package com.example.jvm_lecture.classloader;

/**
 * @Author: 蔡翔
 * @Date: 2020/4/25 18:22
 * @Version 1.0
 */
public class MyTest1 {
    public static void main(String[] args) {
        /**
         * 加载顺序 其实是先加载父类 再加载子类。
         * -XX:+TraceClassLoading,用于追踪类的加载信息并打印出来
         *
         * -XX:+<option>  ，，表示开启option选项。
         * -XX:-<option>  ，，表示关闭option选项。
         * -XX:<option>=<value>  ，，表示将option选项的值设置为value
         * */
        /**
         * test1
         * 对于静态字段来说，只有直接定义了该字段的类才会被初始化
         *
         * 结果:    //因为myChild1 没有直接定义str 所以没有被初始化
         *      myParent1 static block
         *      hello word
         * */
        //System.out.println(myChild1.str);

        System.out.println();
        System.out.println();
        System.out.println();
        /**
         * test2
         * 初始化一个类的子类 的时候，这个类 也会被初始化（也是主动使用）
         *
         * 结果:
         *      myParent1 static block   //如果在此之前 myParent1已经被初始化，那么不会被重复初始化
         *      myChild1 static block
         *      welcome
         * */
        System.out.println(myChild1.str2);

    }
}

class myParent1{
    public static String str = "hello word";
    //静态代码块 在程序初始化的 时候就会执行的
    static {
        System.out.println("myParent1 static block");
    }
}
class myChild1 extends myParent1{
    public static String str2 = "welcome";
    static {
        System.out.println("myChild1 static block");
    }
}